/* 
 * Autores:
 *      Jonathan Lopez  11106
 *      Jorge Martínez  11237
 * 
 * Archivo: Localizacion.java
 * Última Revision: $Rev: 69 $
 *      Fecha: $Date: 2011-09-19 06:58:38 +0000 (Mon, 19 Sep 2011) $
 */ 

package Manejo.Transporte;

import Archivador.*;

/**
 * Representa una posicion en el mundo, con país y coordenadas.
 * 
 * @author Jonathan López
 * @author Jorge Martinez
 */
public class Localizacion implements iArchivable
{
    private String pais;
    private double latitud;
    private double longitud;

    /**
     * Constructor de una Localizacion
     * @param pais País en que se encuentra la posición dada, o un String
     * vacío si no se encuentra en ningún país en particular.
     * @param latitud latitud de la coordenada, en grados
     * @param longitud longitud de la coordenada, en grados
     */
    public Localizacion(String pais, double latitud, double longitud)
    {
        this.pais = pais;
        this.latitud = latitud;
        this.longitud = longitud;
    }
    
    /**
     * Devuelve la latitud del objeto (en el mundo)
     * @return latitud (en grados)
     */
    public double obtenerLatitud() {
        return latitud;
    }

    /**
     * Devuelve la longitud del objeto (en el mundo)
     * @return longitud (en grados)
     */
    public double obtenerLongitud() {
        return longitud;
    }

    /**
     * Devuelve el país en el que se ubica el país, si es que existe
     * @return país (String)
     */
    public String obtenerPais() {
        return pais;
    }

    /**
     * Devuelve una representación String de la Localización que incluye el
     * país, la latitud y la longitud.
     * @return representación String.
     */
    @Override
    public String toString() {
        return pais + ":" + latitud + "N, " + longitud + "E";
    }   
    
    /**
     * Regresa un línea de texto para ser guardada en un medio persistente.
     * @return String
     * @see iArchivable#guardar() 
     */
    @Override
    public String guardar(){
        // Orden: pais, latitud, longitud
        String linea = "[";
        linea += pais + separador;
        linea += latitud + separador;
        linea += longitud;
        linea += "]";
        
        return linea;
    }
    
    /**
     * Genera una nueva Localización a partir de una línea de texto creada a
     * través del método guardar()
     * @param linea
     * @return nueva Localización a partir del String, o null si falla
     */
    public static Localizacion parseLocalizacion( String linea ){
        // Validar linea
        if( !Util.validarLinea(linea) )
            return null;
        
        // Recortar corchetes
        String srLoc = Util.eliminarExtremos(linea);
        if( srLoc.equals("") )
            return null;
        
        // Partir la linea
        String partes[] = srLoc.split(separador);
        int cantidadPartes = 3;
        if( partes.length != cantidadPartes )
            return null;
        
        // Parsear elementos
        // Orden: pais, latitud, longitud
        String _pais = partes[0];
        double _latitud = Double.parseDouble(partes[1]);
        double _longitud = Double.parseDouble(partes[2]);
        
        return new Localizacion(_pais, _latitud, _longitud);
    }
    
    /**
     * Punto de entrada para las pruebas unitarias de Localizacion.
     * @param args
     */
    public static void main( String[] args ){
        int pruebas = 10;
        int fallos = 0;
        java.util.Random generador = new java.util.Random();
        
        for (int n = 0; n != pruebas; n++) {
            Localizacion localizacion = new Localizacion( "Guatemala, CA", 
                    generador.nextDouble(), generador.nextDouble() );
            String linea = localizacion.guardar();
            Localizacion nuevaLocalizacion = Localizacion.parseLocalizacion(linea);
            
            boolean iguales = localizacion.toString().equals(nuevaLocalizacion.toString());
            if( !iguales )
                ++fallos;
            
            System.out.println(linea + " & " + iguales );
            System.out.println("\t" + localizacion);
            System.out.println("\t" + nuevaLocalizacion);
        }
        System.out.println("FALLOS: " + fallos);
    }
}
